/*
 * StringUtils.java
 *
 *  created: 4.9.2011
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.util;

import java.text.Normalizer;

/**
 *
 * @author Martin Pokorný
 * @version 0.1
 */
public class StringUtils {
    
    /** */
    private StringUtils() {
    }
    
    /**
     * Ze zadaného řetězce odstraní diakritiku (akcentové
     * znaky nahradí znaky bez akcentu).
     * <p>
     * např:
     * <pre><tt>
     * České třešně  -->  Ceske tresne
     * </tt></pre>
     *
     * @param text  původní řetězec
     * @return  nový řetězec bez diakritických znamének
     * @throws java.lang.IllegalArgumentException
     */
    public static String removeDiacriticalMarks (final String text)
            throws IllegalArgumentException {        
        if (text == null) {
            throw new IllegalArgumentException("source=null");
        }
        // Rozdělí znaky na písmeno a akcent; akcenty následně odstraní
        String decomposed = Normalizer.normalize(
                text, Normalizer.Form.NFD);
        return decomposed.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    }

    /**
     * Testuje zda je zadaný řetězec prázdný nebo obsahuje jen mezery.
     * <p>
     * např:
     * <pre><tt>
     * StringUtils.isBlank(null)        = true
     * StringUtils.isBlank("")          = true
     * StringUtils.isBlank("  ")        = true
     * StringUtils.isBlank("alice")     = false
     * StringUtils.isBlank("  alice  ") = false
     * </tt></pre>
     * 
     * @param text
     * @return 
     */
    public static boolean isBlank(String text) {
        return text == null || text.trim().isEmpty();
    }
    
    /**
     * Testuje zda je zadaný řetězec prázdný.
     * <p>
     * např:
     * <pre><tt>
     * StringUtils.isEmpty(null)        = true
     * StringUtils.isEmpty("")          = true
     * StringUtils.isEmpty("  ")        = false
     * StringUtils.isEmpty("alice")     = false
     * StringUtils.isEmpty("  alice  ") = false
     * </tt></pre>
     * 
     * @param text
     * @return
     */
    public static boolean isEmpty(String text) {
        return text == null || text.isEmpty();
    } 




    /**
     * Před základní text přidá zadaný znak tolikrát, aby výsledný text 
     * měl požadovanou délku.
     * <p>
     * <pre><tt>
     * base="test" length=6  pad='0'  -->  "00test"
     * base="test" length=3  pad='_'  -->  "test"
     * base=""     length=5  pad='*'  -->  "*****"
     * </tt></pre>
     * 
     * @param base
     * @param length
     * @param pad
     * @return 
     * @throws IllegalArgumentException
     */     
    public static String leftTextPad(String base, int length, char pad) {
        if (base == null) {
            throw new IllegalArgumentException("base = null");
        }
        if (length <= 0) {
            throw new IllegalArgumentException("length <= 0");
        }
        
        int padLen = length - base.length();
        if (padLen <= 0) {
            return base;
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i=base.length(); i<length; i++) {
            sb.append(pad);
        }
        sb.append(base);

        return sb.toString();
    }
    
    /**
     * První znak textu změní na velké písmeno.
     * <p>
     * <pre><tt>
     * ahoj, jak se máš?  -->  Ahoj, jak se máš?
     * </tt></pre>
     * 
     * @param text
     * @return 
     */
    public static String capitalize(String text) {
        if (StringUtils.isEmpty(text)) { 
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(text.substring(0, 1).toUpperCase());
        if (text.length() > 1) {
            sb.append(text.substring(1));
        }
        return sb.toString();        
    }
    
    /**
     * První písmena všech slov změní na velká písmena.
     * <p>
     * <pre><tt>
     * ahoj, jak se máš?  -->  Ahoj, Jak Se Máš?
     * </tt></pre>
     * 
     * @param text
     * @return 
     */
    public static String capitalizeAllWords(String text) {
        if (StringUtils.isEmpty(text)) { 
            return "";
        }        
        StringBuilder sb = new StringBuilder();
        String[] words = text.split("\\b");
        for (String word : words) {
            sb.append(capitalize(word));
        }        
        return sb.toString();
    }
    
}   // StringUtils
